package com.scau402.system1.domain.po;

import com.baomidou.mybatisplus.annotation.TableName;
import com.scau402.common.core.domain.entity.SysUser;
import com.scau402.system1.domain.dto.CalWarehouseNumAndValueDTO;
import com.scau402.system1.repository.IWmsJadeRepository;
import com.scau402.system1.utils.IdGenerator;
import lombok.Data;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 盘点单详情
 * @since 2024/1/20
 */
@Data
@TableName("wms_checkbound_order_detail")
public class WmsCheckboundOrderDetailPO {
    /**
     * 主键
     */
    private Long id;
    /**
     * 盘点单id
     */
    private Long checkOrderId;
    /**
     * 盘点单号
     */
    private String orderCode;
    /**
     * 总量
     */
    private Long totalNum;
    /**
     * 总价值
     */
    private BigDecimal totalPrice;
    /**
     * 已盘点数量
     */
    private Long curNum;
    /**
     * 已盘点价值
     */
    private BigDecimal curPrice;
    /**
     * 创造者
     */
    private String createBy;
    /**
     * 创建时间
     */
    private LocalDateTime createTime;
    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 构建详情
     * @param idGenerator 自定义id生成器
     * @param checkOrderId 关联的盘点单id
     * @param orderCode 盘带单号
     * @param user 创建用户
     */
    public void build(IdGenerator idGenerator, Long checkOrderId,String orderCode, SysUser user) {
        // 创建盘点详情单
        this.id = idGenerator.nextId("checkboundDetail");
        this.checkOrderId = checkOrderId;
        // TODO: 测试阶段盘点单号暂定为 PD+当前时间戳，后续根据实现修改
        this.orderCode = orderCode;
        this.createBy = user.getUserName();
        this.createTime = LocalDateTime.now();
        this.updateTime = this.createTime;
    }

    /**
     * 盘点详情的总价值和总数量赋值
     * @param NAV 计算结果
     */
    public void setNumAndPrice(CalWarehouseNumAndValueDTO NAV) {
        //设置总量
        this.totalNum = NAV.getTotalNum();
        this.totalPrice = NAV.getTotalValue();
        //初始化当前数量
        this.curNum = 0L;
        this.curPrice = new BigDecimal(0);
    }

    /**
     * 更新详情中的已盘点数量和价值
     * @param num 更新的数量
     */
    public void updateNumAndPrice(Long num,WmsCheckboundJadeDetailPO jadeDetail) {
        this.curNum+=num;
        this.curPrice = this.curPrice.add(jadeDetail.getCostPrice().multiply(new BigDecimal(num)));
    }
}
